import {
  ddescribe,
  describe,
  it,
  iit,
  xit,
  expect,
  beforeEach,
  afterEach,
  browserDetection,
  inject,
  TestComponentBuilder,
  AsyncTestCompleter
} from 'angular2/testing_internal';

import {ReplacePipe} from 'angular2/common';
import {RegExpWrapper, StringJoiner} from 'angular2/src/facade/lang';

export function main() {
  describe("ReplacePipe", () => {
    var someNumber: number;
    var str;
    var pipe;

    beforeEach(() => {
      someNumber = 42;
      str = 'Douglas Adams';
      pipe = new ReplacePipe();
    });

    describe("transform", () => {

      it("should not support input other than strings and numbers", () => {
        expect(() => pipe.transform({}, ["Douglas", "Hugh"])).toThrow();
        expect(() => pipe.transform([1, 2, 3], ["Douglas", "Hugh"])).toThrow();
      });

      it("should not support patterns other than strings and regular expressions", () => {
        expect(() => pipe.transform(str, [{}, "Hugh"])).toThrow();
        expect(() => pipe.transform(str, [null, "Hugh"])).toThrow();
        expect(() => pipe.transform(str, [123, "Hugh"])).toThrow();
      });

      it("should not support replacements other than strings and functions", () => {
        expect(() => pipe.transform(str, ["Douglas", {}])).toThrow();
        expect(() => pipe.transform(str, ["Douglas", null])).toThrow();
        expect(() => pipe.transform(str, ["Douglas", 123])).toThrow();
      });

      it("should return a new string with the pattern replaced", () => {
        var result1 = pipe.transform(str, ["Douglas", "Hugh"]);

        var result2 = pipe.transform(str, [RegExpWrapper.create("a"), "_"]);

        var result3 = pipe.transform(str, [RegExpWrapper.create("a", "i"), "_"]);

        var f = (x => { return "Adams!"; });

        var result4 = pipe.transform(str, ["Adams", f]);

        var result5 = pipe.transform(someNumber, ["2", "4"]);

        expect(result1).toEqual("Hugh Adams");
        expect(result2).toEqual("Dougl_s Ad_ms");
        expect(result3).toEqual("Dougl_s _d_ms");
        expect(result4).toEqual("Douglas Adams!");
        expect(result5).toEqual("44");
      });

    });

  });
}
